//
// Created by 86138 on 2025/5/19.
//
#include "SqQueue.h"

void InitQueue(SqQueue &Q) {
    Q.base = (QElemType *) malloc(MAX_QSIZE * sizeof (QElemType));
    if (!Q.base) exit(OVERFLOW);
    Q.front = Q.rear = 0;
}

void DestroyQueue(SqQueue &Q) {
    if (Q.base) {
        free(Q.base);
    }
    Q.base = nullptr;
}

bool QueueEmpty(SqQueue Q) {
    return Q.front == Q.rear;
}

int QueueLength(SqQueue Q) {
//    if (Q.front <= Q.rear) return Q.rear - Q.front;
//    else return Q.rear + MAX_QSIZE - Q.front;
    // 更好的方法是
    return (Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;
}

Status EnQueue(SqQueue &Q, QElemType e) {
    if ((Q.rear + 1) % MAX_QSIZE == Q.front) {
        printf("队列已满，不能入队元素%d\n", e);
        return ERROR;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAX_QSIZE;
    return OK;
}

Status DeQueue(SqQueue &Q, QElemType &e) {
    if (Q.front == Q.rear) {
        printf("队列空，不能出队元素%d\n", e);
        return ERROR;
    }
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAX_QSIZE;
    return OK;
}

Status GetHead(SqQueue Q, QElemType &e) {
    if (Q.front == Q.rear) {
        printf("队列空，获取队头元素\n");
        return ERROR;
    }
    e = Q.base[Q.front];
    return OK;
}

void DispQueue(SqQueue Q) {
    if (QueueLength(Q) == 0) {
        printf("空队列，结束\n");
    }
    for (int i = Q.front; i <= Q.rear - 1; i = (i + 1) % MAX_QSIZE) {
        printf("%d ", Q.base[i]);
    }
    printf("\n");
}

//int main() {
//    system("chcp 65001");
//    SqQueue Q;
//    InitQueue(Q);
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    EnQueue(Q, 5);
//    EnQueue(Q, 6);
//    EnQueue(Q, 7);
//    QElemType e;
////    DeQueue(Q, e);
//    DispQueue(Q);
//
//    return 0;
//}